package cn.chinaunicom.fast.common.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.CodeSource;
import java.security.ProtectionDomain;
import java.util.stream.Stream;

import lombok.extern.slf4j.Slf4j;

/**
 *
 * @ProjectName: core
 * @Package: com.springboot.cloud.common.core.util
 * @ClassName: ObjectUtils
 * @Description: object工具类
 * @Author: wangjc
 * @CreateDate: 2021-09-13
 * @UpdateUser: 更新者
 * @UpdateDate: 2021-09-13
 * @UpdateRemark: 更新内容
 * @Version: 1.0
 */
@Slf4j
public class ObjectUtils {

	/**
	 * 清理不用的大对象
	 * 
	 * @param objs
	 */
	public static void cleanObjects(Object... objs) {
		if (objs == null) {
			return;
		}
		Stream.of(objs).forEach(obj -> obj = null);
		System.gc();
	}

	/**
	 * 保存对象到文件中
	 * 
	 * @param fileName		对象存储的路径
	 * @param obj			需要存储的对象
	 */
	public static void saveObj(String fileName, Object obj) {
		try (FileOutputStream fos = new FileOutputStream(new File(fileName));
				ObjectOutputStream out = new ObjectOutputStream(fos);) {
			out.writeObject(obj);
		} catch (Exception e) {
			log.error("对象写入异常: {}", e);
			e.printStackTrace();
		}
	}

	/**
	 * 读取文件中的对象
	 * 
	 * @param fileName
	 * @return
	 */
	public static Object readObj(String fileName) {
		try (FileInputStream fis = new FileInputStream(new File(fileName));
				ObjectInputStream ois = new ObjectInputStream(fis);) {
			return ois.readObject();
		} catch (Exception e) {
			log.error("对象写入异常: {}", e);
		}
		return null;
	}

	/**
	 * 获取运行时当前jar包所在路径
	 * （目录地址为classes目录，如果是jar包的话则是null）
	 * @return
	 */
	public static String getRuntimeJarPath() {
		Class<?> clazz = ObjectUtils.class;
		ProtectionDomain domain = clazz.getProtectionDomain();
		CodeSource source = domain.getCodeSource();
		URL url = source.getLocation();
		String path = "";
		try {
			path = url.toURI().getPath();
		} catch (URISyntaxException e) {
			e.printStackTrace();
		}
		return path;
	}

	/**
	 * 获取默认文件路径
	 * （目录地址为项目部署目录）
	 * @return
	 */
	public static String getDefaultFilePath() {
		String path = new File("").getAbsolutePath();
		return path + File.separator;
	}
}
